﻿#ifndef DXL360COMM_H
#define DXL360COMM_H

/// @file dxl360comm.h
/// @details DXL360 是一款双轴倾角仪，也可以叫做数显角度尺。DXL360Comm 是用来接收 DXL360 发送的数据的软件模块。
/// DXL360 本身无法与电脑直接相连，需要额外配置通讯模块，常见的通讯模块为蓝牙模块和 232 串口模块。
/// 蓝牙模块实际上也是模拟了电脑上的一个 232 串口，对于软件来说还是只需要读取串口的数据。
/// DXL360 通过串口传来的数据格式为 X+0000Y+0000, 其中 “+” 可以为“+” 或 “-”。表示的是角度的正负号。
/// “0000” 是具体的数据，实际的角度值为这个数除以 100，单位为度。
/// DXL360 通电之后就发送数据，数据间隔大约为 0.5s。串口设置为 9600,N,8,1

#include <QSerialPort>
#include <QPair>
#include <QDateTime>
/**
 * @brief The DXL360Comm class
 */
class DXL360Comm: public QObject
{
    Q_OBJECT
public:
    DXL360Comm();
    ~DXL360Comm();
    /**
     * @brief value 获取倾角仪的数据
     * @param x X 轴的角度
     * @param y Y 轴的角度
     * @return  true 表示返回的值是在 1s 之内获得的数值。
     *          false 表示获得数值是更早时刻的，正常情况下 DXL360每隔 0.5s 返回一组数据。1s 之内都没有数据表明通讯出了问题。
     */
    bool value(double &x, double &y);
public slots:
    /**
     * @brief setPortName 指定读取那个串口，格式类似："COM1"、"COM2"
     * @param name，串口号，取值可为："COM1"、"COM2"、"COM3"、"COM4"...
     */
    void setPortName(QString name);
    /**
     * @brief start 打开串口，开始收取数据
     */
    bool start();
    /**
     * @brief stop 关闭串口，不再接收数据
     */
    void stop();
signals:
    /**
     * @brief dataReady 每次收到一组数据时就会发出这个信号
     * @param x
     * @param y
     */
    void dataReady(double x, double y);
private slots:
    void on_readyRead();
private:
    void stateMachine(char x);
    QSerialPort m_port;
    int m_state;
    int m_count;
    char m_bufferX[6];
    char m_bufferY[6];
    QDateTime m_time;
    double m_x;
    double m_y;
};

#endif // DXL360COMM_H
